MAX = 100  # 定义常量MAX，表示通讯录最大容量

# 定义显示菜单的函数
def menu():
    print("------------------------欢迎来到学生通讯录管理系统-------------------------")
    print("                            1. 建立通讯录")
    print("                            2. 插入联系人信息")
    print("                            3. 删除联系人信息")
    print("                            4. 查找联系人信息")
    print("                            5. 显示联系人信息")
    print("                            6. 修改联系人信息")
    print("                            7. 导入联系人信息")
    print("                            8. 导出联系人信息")
    print("                            9. 退出系统管理")
    print("---------------------------------------------------------------------------")

# 初始化通讯录，返回一个包含数据和长度的字典
def init():
    return {"data": [], "len": 0}

# 创建通讯录函数
def create(L):
    flag = 1  # 控制是否继续输入的标志
    while flag != 0:
        # 输入联系人信息
        name = input("请输入姓名：")
        tel = input("请输入学号：")
        email = input("请输入邮箱：")
        address = input("请输入地址：")
        category = input("请输入联系人类别（同学、老师、家长等）：")
        # 将信息加入通讯录
        L["data"].append({"name": name, "tel": tel, "email": email, "address": address, "category": category})
        L["len"] += 1  # 通讯录长度加1
        # 询问是否继续输入
        flag = int(input("是否继续输入，继续请输入1，结束请输入0，请输入："))

# 插入联系人信息函数
def insert(L):
    if L is None:
        print("请先建立通讯录！")
        return
    i = int(input("您要插入在第几个："))  # 获取插入位置
    # 输入联系人信息
    name = input("联系人的姓名为：")
    tel = input("联系人的学号为：")
    email = input("联系人的邮箱为：")
    address = input("联系人的地址为：")
    category = input("联系人的类别为：")
    # 判断插入位置是否合法
    if 1 <= i <= L["len"] + 1:
        # 插入信息
        L["data"].insert(i - 1, {"name": name, "tel": tel, "email": email, "address": address, "category": category})
        L["len"] += 1  # 通讯录长度加1
        print("插入成功，通讯录信息为：")
        output(L)  # 显示通讯录信息
        return 1
    else:
        print("无法插入，插入的位置不合法")
        return 0

# 删除联系人信息函数
def delete(L, i):
    # 判断删除位置是否合法
    if 1 <= i <= L["len"]:
        del L["data"][i - 1]  # 删除指定位置的信息
        L["len"] -= 1  # 通讯录长度减1
        print(f"已成功删除第{i}个")
        print("删除成功后显示为：")
        output(L)  # 显示通讯录信息
        return 1
    return -1

# 选择删除方式函数
def deleteway(L):
    if L is None:
        print("请先建立通讯录！")
        return
    m = int(input("删除的方式为：1、按顺序，2、按姓名，3、按学号\n"))
    if m == 1:
        x = int(input("您要删除第几个："))
        delete(L, x)  # 按顺序删除
    elif m == 2:
        name = input("请输入姓名：")
        i = find_by_name(L, name) + 1  # 查找姓名对应的位置
        delete(L, i)  # 按姓名删除
    elif m == 3:
        tel = input("请输入学号：")
        i = find_by_tel(L, tel) + 1  # 查找学号对应的位置
        delete(L, i)  # 按学号删除

# 查找联系人信息函数
def search_contact(L):
    if L is None:
        print("请先建立通讯录！")
        return
    x = int(input("请输入查找的方式：1、按姓名 2、按学号 3、按类别\n"))
    if x == 1:
        name = input("请输入姓名：")
        i = find_by_name(L, name)
        if i != -1:
            # 显示查找到的联系人信息
            print(f"你要找的人的信息为：姓名：{L['data'][i]['name']} 学号：{L['data'][i]['tel']} 邮箱：{L['data'][i]['email']} 地址：{L['data'][i]['address']} 类别：{L['data'][i]['category']}")
        else:
            print("没有找到该联系人")
    elif x == 2:
        tel = input("请输入学号：")
        i = find_by_tel(L, tel)
        if i != -1:
            # 显示查找到的联系人信息
            print(f"你要找的人的信息为：姓名：{L['data'][i]['name']} 学号：{L['data'][i]['tel']} 邮箱：{L['data'][i]['email']} 地址：{L['data'][i]['address']} 类别：{L['data'][i]['category']}")
        else:
            print("没有找到该联系人")
    elif x == 3:
        category = input("请输入类别：")
        results = find_by_category(L, category)
        if results:
            # 显示查找到的所有同类别联系人信息
            for contact in results:
                print(f"姓名：{contact['name']} 学号：{contact['tel']} 邮箱：{contact['email']} 地址：{contact['address']} 类别：{contact['category']}")
        else:
            print("没有找到该类别的联系人")
    else:
        print("输入方式有误！")

# 根据姓名查找联系人函数
def find_by_name(L, name):
    for i in range(L["len"]):
        if L["data"][i]["name"] == name:
            return i
    return -1

# 根据学号查找联系人函数
def find_by_tel(L, tel):
    for i in range(L["len"]):
        if L["data"][i]["tel"] == tel:
            return i
    return -1

# 根据类别查找联系人函数
def find_by_category(L, category):
    results = []
    for i in range(L["len"]):
        if L["data"][i]["category"] == category:
            results.append(L["data"][i])
    return results

# 输出通讯录信息函数
def output(L):
    for i in range(L["len"]):
        print(f"姓名：{L['data'][i]['name']}, 学号：{L['data'][i]['tel']}, 邮箱：{L['data'][i]['email']}, 地址：{L['data'][i]['address']}, 类别：{L['data'][i]['category']}")

# 修改联系人信息函数
def modify_contact(L):
    if L is None:
        print("请先建立通讯录！")
        return
    x = int(input("请输入修改的方式：1、按姓名 2、按学号\n"))
    if x == 1:
        name = input("请输入姓名：")
        i = find_by_name(L, name)
        if i != -1:
            modify(L, i)
        else:
            print("没有找到该联系人")
    elif x == 2:
        tel = input("请输入学号：")
        i = find_by_tel(L, tel)
        if i != -1:
            modify(L, i)
        else:
            print("没有找到该联系人")
    else:
        print("输入方式有误！")

# 修改联系人具体信息函数
def modify(L, i):
    # 输入新的联系人信息
    name = input(f"请输入新的姓名（当前：{L['data'][i]['name']}）：")
    tel = input(f"请输入新的学号（当前：{L['data'][i]['tel']}）：")
    email = input(f"请输入新的邮箱（当前：{L['data'][i]['email']}）：")
    address = input(f"请输入新的地址（当前：{L['data'][i]['address']}）：")
    category = input(f"请输入新的类别（当前：{L['data'][i]['category']}）：")
    # 更新通讯录信息
    L["data"][i] = {"name": name, "tel": tel, "email": email, "address": address, "category": category}
    print("修改成功，通讯录信息为：")
    output(L)

# 导入联系人信息函数
def import_contacts(L):
    if L is None:
        print("请先建立通讯录！")
        return
    filename = input("请输入要导入的文件名：")
    try:
        with open(filename, 'r', encoding='utf-8') as f:
            lines = f.readlines()
            for line in lines:
                contact = line.strip().split(",")
                L["data"].append({"name": contact[0], "tel": contact[1], "email": contact[2], "address": contact[3], "category": contact[4]})
            L["len"] = len(L["data"])
            print("导入成功，通讯录信息为：")
            output(L)
    except Exception as e:
        print(f"导入失败，错误信息：{e}")

# 导出联系人信息函数
def export_contacts(L):
    if L is None:
        print("请先建立通讯录！")
        return
    filename = input("请输入要导出的文件名：")
    try:
        with open(filename, 'w', encoding='utf-8') as f:
            for contact in L["data"]:
                f.write(f"{contact['name']},{contact['tel']},{contact['email']},{contact['address']},{contact['category']}\n")
            print("导出成功")
    except Exception as e:
        print(f"导出失败，错误信息：{e}")

# 记录日志信息函数
def log(message):
    with open("log.txt", "a", encoding="utf-8") as log_file:
        log_file.write(message + "\n")  # 将日志信息写入文件

# 主函数
def main():
    L1 = None  # 初始化通讯录
    menu()  # 显示菜单
    a = int(input("请选择要运行的项目："))  # 用户选择要执行的操作
    while a != 9:  # 选择不为9则继续执行
        if a == 1:
            L1 = init()  # 初始化通讯录
            create(L1)  # 创建通讯录
            log("建立通讯录")  # 记录日志
        elif a == 2:
            insert(L1)  # 插入联系人信息
            log("插入联系人信息")  # 记录日志
        elif a == 3:
            deleteway(L1)  # 删除联系人信息
            log("删除联系人信息")  # 记录日志
        elif a == 4:
            search_contact(L1)  # 查找联系人信息
            log("查找联系人信息")  # 记录日志
        elif a == 5:
            output(L1)  # 显示联系人信息
            log("显示联系人信息")  # 记录日志
        elif a == 6:
            modify_contact(L1)  # 修改联系人信息
            log("修改联系人信息")  # 记录日志
        elif a == 7:
            import_contacts(L1)  # 导入联系人信息
            log("导入联系人信息")  # 记录日志
        elif a == 8:
            export_contacts(L1)  # 导出联系人信息
            log("导出联系人信息")  # 记录日志
        else:
            print("输入错误！")  # 处理无效输入
        a = int(input("请选择要运行的项目："))  # 重新选择要执行的操作
    print("您已成功退出系统！")  # 退出系统
    log("退出系统")  # 记录退出日志

# 检查是否作为主程序运行
if __name__ == "__main__":
    main()
